﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace DataValidateAttribute
{
    public static class ValidateContext
    {
        /// <summary>
        /// 验证方法的参数是否合法
        /// </summary>
        /// <param name="values"></param>
        public static void Validate(object[] values)
        {
            //从方法栈中拿到刚执行的方法
            MethodInfo method = (MethodInfo)(new StackTrace().GetFrame(1).GetMethod());

            //获取到方法的参数
            ParameterInfo[] parameterInfos = method.GetParameters();
            if (parameterInfos.Length == 0)
                return;

            int index = 0;
            //遍历所有的参数
            foreach (var item in parameterInfos)
            {
                //获取被标记的特性的数组
                ValidateAttribute[] attributes = (ValidateAttribute[])Attribute.GetCustomAttributes(item, typeof(ValidateAttribute));
                if (attributes != null)
                {
                    foreach (var attr in attributes)
                    {
                        //如果没有异常就证明验证通过
                        try
                        {
                            attr.ArgumentName = item.Name;
                            attr.IsValidation(values[index]);
                        }
                        //如果有异常那么就表示验证没有通过，抛出我们指定的异常
                        catch (Exception e)
                        {
                            throw e;
                        }
                    }
                    index += 1;
                }
            }
        }
    }
}
